package ru.lab1client.dasbundos;

/*
 * TODO 
 * 1. По жмяку на старт добиться простого клиент-серверного взаимодействия:
 * 	андроид клиент <-> сервер. Нужно чтобы сервер выдал строчку:
 * 	"Client такой-то connected"
 * 	Параметры соединения пока хардкодить.
 * 	Нужно задать порт для подключения к серверу: 31007
 * 
 * 2. Научиться работать с потоками. Создать. Описать действия потока.
 * 		Создать два потока, которые выводят в цикле числа. Первый поток
 * 		- одно число, второй - другое.
 * 
 * 3. попытаться создать мултипоточный клиент
 * 		Можно и нужно использовать исходник java-клиента.
 * 		Т.е. каждый сокет клиента должен работать в отдельном потоке
 * */

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class ClientThread extends Thread {

	/*
	 * Сокет для чтения/записи данных
	 */
	private Socket mSocket;

	/*
	 * Входной поток сокета. Чтение данных
	 */
	private BufferedReader mIn;

	/*
	 * Выходной поток сокета. Запись данных
	 */
	private PrintWriter mOut;

	/*
	 * Сообщение для прекращения обмена данными
	 */
	private final String mShutdownMessage = "shutdown";
	
	/*
	 * Идентификатор потока
	 * */	
	private int mClientId;
	
	/*
	 * Сообщение приветствия
	 */
	private static final String mHelloMessage = "hello";
	
	/*
	 * Команда для подсчета кв. корня
	 */
	private static final String mSqrtCommand = "sqrt";
	
	/*
	 * Конструктор
	 * */
	public ClientThread(InetAddress inetAddress, int id) {
		mClientId = id;
		try {
			mSocket = new Socket(inetAddress, MultiThreadClient.SERVER_PORT);
		}
		catch (IOException e) {
			System.err.println("Socket creating failed");
		}
		try {
			mIn = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
			mOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream())), true);
			 
			 // запуск потока
			 start();
		}
		catch (IOException e) {
			// Сокет должен быть закрыт при любой
			// ошибке, кроме ошибки конструктора сокета:
			try {
				mSocket.close();
			}
			catch (IOException e2) {
				System.err.println("Socket is not closed");
			}
			
			// В противном случае сокет будет закрыт
			// в методе run() потока.
		}
	}
		 
	public void run() {
		String fromServerMessage = "";
		
		try {
			System.out.println("DEBUG: client " + mClientId + " started");
			
			System.out.println("DEBUG: client " + mClientId + " sends: " + mHelloMessage + " " + mClientId);
			mOut.println(mHelloMessage + " " + mClientId);
			
			fromServerMessage = mIn.readLine();
			System.out.println("DEBUG: message from server: " + fromServerMessage);
			
			try {
				sleep(5000);
			}
			catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			System.out.println("DEBUG: client " + mClientId + " sends: " + mSqrtCommand + " " + 10000);
			mOut.println(mSqrtCommand + " " + 10000);
			fromServerMessage = mIn.readLine();
			System.out.println("DEBUG: message from server: " + fromServerMessage);			
						
			mOut.println(mShutdownMessage);
		}
		catch (IOException e) {
			System.err.println("IO Exception");
		}
		finally {
			System.out.println("DEBUG: client " + mClientId + " closed");
			
			// всегда закрывать сокет
			try {
				mSocket.close();
				MultiThreadClient.mThreads--;
			}
			catch (IOException e) {
				System.err.println("Socket is not closed");
			}
		}
	}	
	
}